package com.ifdom.dynamicproxy.dynamicstate;

//import sun.misc.ProxyGenerator;

import java.io.FileOutputStream;


/**
 * 动态代理
 * 执行测试
 *
 * 涉及的 Java [类加载机制](https://zhuanlan.zhihu.com/p/347141071)
 *
 * 动态代理: 就是想办法，根据接口或目标对象，计算出代理类的字节码，然后再加载到JVM中使用。
 * @author dell
 */
public class DynamicAgent {
    public static void main(String[] args) throws Exception {

        // 真实角色
        Landlord tom = new Landlord("Tom");

        // 创建代理执行人
        DynamicProxyHandle dynamicProxyHandle = new DynamicProxyHandle();

        // 设置代理对象
        dynamicProxyHandle.setLandlord(tom);


        // 获取被代理后的对象(接口)
        Rent proxy = (Rent) dynamicProxyHandle.getProxy();
        Swing proxy1 = (Swing) dynamicProxyHandle.getProxy();

        // 执行代理动作
        proxy.rent();
        proxy1.swing("狗刨");


        // 这里我们将jdk生成的代理类输出了出来，方便后面分析使用

//        byte[] bytes = ProxyGenerator.generateProxyClass("$Proxy0",new Class[]{tom.getClass()});
//
//        FileOutputStream os = new FileOutputStream("Proxy0.class");
//        os.write(bytes);
//        os.close();

    }
}